Crate seq_macro[−][src]
Imagine for-loops in a macro
This crate provides a seq!
macro to repeat a fragment of source code and
substitute into each repetition a sequential numeric counter.
use seq_macro::seq; fn main() { let tuple = (1000, 100, 10); let mut sum = 0; // Expands to: // // sum += tuple.0; // sum += tuple.1; // sum += tuple.2; // // This cannot be written using an ordinary for-loop because elements of // a tuple can only be accessed by their integer literal index, not by a // variable. seq!(N in 0..=2 { sum += tuple.N; }); assert_eq!(sum, 1110); }
-
If the input tokens contain a section surrounded by
#(
…)*
then only that part is repeated. -
The numeric counter can be pasted onto the end of some prefix to form sequential identifiers.
use seq_macro::seq; seq!(N in 64..=127 { #[derive(Debug)] enum Demo { // Expands to Variant64, Variant65, ... #( Variant#N, )* } }); fn main() { assert_eq!("Variant99", format!("{:?}", Demo::Variant99)); }
-
Byte and character ranges are supported:
b'a'..=b'z'
,'a'..='z'
. -
If the range bounds are written in binary, octal, hex, or with zero padding, those features are preserved in any generated tokens.
use seq_macro::seq; seq!(P in 0x000..=0x00F { // expands to structs Pin000, ..., Pin009, Pin00A, ..., Pin00F struct Pin#P; });
Macros
seq |